home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / VideoToolbox 96.06.15 / VideoToolboxSources / HexToBinary.c < prev    next >
Text File  |  1995-06-17  |  2KB  |  71 lines

  1. /*
  2. HexToBinary.c
  3. Two routines that translate back and forth between a binary object (some number
  4. of bytes at a specified address) and a string of hexadecimal digits. Two hex
  5. digits represent one binary byte.
  6.  
  7. PORTABILITY: Standard C.
  8.  
  9. HISTORY:
  10. 5/27/93 dgp wrote it, partly based on code I'd previously written for 
  11.             PixMapToPostScript.c 
  12. 6/15/93    dgp minor editing
  13. */
  14. #include "VideoToolbox.h"
  15.  
  16. int HexToBinary(char *string,void *ptr)
  17. /* Fast translation of a hex string of arbitrary length. */
  18. {
  19.     register unsigned char *byte,c,dehex[256];
  20.     register unsigned long i;
  21.     size_t digits;
  22.  
  23.     for(i=0;i<sizeof(dehex);i++)dehex[i]=255;
  24.     for(i=0;i<10;i++)dehex[i+'0']=i;
  25.     for(i=0;i<6;i++)dehex[i+'a']=dehex[i+'A']=i+10;
  26.     digits=strlen(string);
  27.     byte=(unsigned char *)string;
  28.     for(i=0;i<digits;i++)if(dehex[*byte++]==255)return 1;    /*  Illegal character */
  29.     byte=(unsigned char *)ptr;
  30.     for(i=digits/2;i>0;i--){
  31.         c=dehex[*string++];
  32.         c<<=4;
  33.         c+=dehex[*string++];
  34.         *byte++ =c;
  35.     }
  36.     return 0;    /*  Success */
  37. }
  38.  
  39. char *BinaryToHex(size_t n,void *ptr,char *string)
  40. /*  Fast encoding of a specified number of bytes as a hex string. */
  41. /*  "string", if not NULL, must be able to hold at least 2*n+1 bytes. */
  42. {
  43.     register long i,j;
  44.     register unsigned short *word,hex[256];
  45.     register unsigned char *byte;
  46.     static const unsigned char c[]="0123456789abcdef";
  47.     long digits;
  48.     short oddAddress;
  49.  
  50.     assert(sizeof(*byte)==1);    /*  required by our algorithm */
  51.     assert(sizeof(*word)==2);    /*  required by our algorithm */
  52.     for(j=0;j<16;j++)for(i=0;i<16;i++)hex[(j<<4)+i]=(c[j]<<8)+c[i];
  53.     digits=2*n;
  54.     if(string==NULL){
  55.         string=(char *)malloc(digits+1);
  56.         if(string==NULL)return NULL;
  57.     }
  58.     oddAddress=(unsigned long)string%2;
  59.     if(oddAddress)string++;
  60.     word=(unsigned short *)string;
  61.     byte=(unsigned char *)ptr;
  62.     for(i=n;i>0;i--)*word++ = hex[*byte++];
  63.     if(oddAddress){
  64.         /* move back */
  65.         string--;
  66.         memmove(string,string+1,digits);
  67.     }
  68.     string[digits]=0;
  69.     return string;
  70. }
  71.